package com.donglan.pethome.quartz.job;

import com.donglan.pethome.order.domain.OrderAdopt;
import com.donglan.pethome.order.mapper.OrderAdoptMapper;
import com.donglan.pethome.organization.domain.Shop;
import com.donglan.pethome.pay.constant.PayConstants;
import com.donglan.pethome.pay.domain.PayBill;
import com.donglan.pethome.pay.mapper.PayBillMapper;
import com.donglan.pethome.pet.domain.Pet;
import com.donglan.pethome.pet.mapper.PetMapper;
import com.donglan.pethome.quartz.domain.QuartzJobInfo;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;

/**
 * @Author: zhangdonghui
 * @Date: 2022/3/18 21:26
 * 执行指定的工作任务
 */
public class QuartzJob implements Job {

    @Autowired
    private PayBillMapper payBillMapper;
    @Autowired
    private OrderAdoptMapper orderAdoptMapper;
    @Autowired
    private PetMapper petMapper;

    @Override
    @Transactional
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        // 获取定时器传递的参数
        QuartzJobInfo quartzJobInfo = (QuartzJobInfo) jobExecutionContext.getMergedJobDataMap().get("params");
        switch (quartzJobInfo.getType()){
            case PayConstants.BUSINESSTYPE_ADOPT:
                // 获取到订单编号
                String orderSn = (String)quartzJobInfo.getParams().get("orderSn");
                // 修改支付单
                PayBill payBill = payBillMapper.loadByOrderSn(orderSn);
                payBill.setState(-1);// 表示支付单取消
                payBill.setUpdateTime(new Date());// 记录支付成功或者订单取消的更新时间
                // 修改支付单
                payBillMapper.update(payBill);

                // 修改领养订单
                OrderAdopt orderAdopt = orderAdoptMapper.loadByOrderSn(orderSn);
                orderAdopt.setState(-1);
                orderAdoptMapper.update(orderAdopt);

                // 修改宠物，重新上架
                String petId = quartzJobInfo.getParams().get("petId").toString();
                // 直接使用 loadById 查询为null
                // 是因为我们在 PetMapper中的  loadById 方法是联表查询，宠物，宠物详情表和店铺
                // 当我们进入到定时任务的时候，宠物表中的shop_id字段就已经为null了
                // 那么联表查询得到的结果一定为null 【JOIN t_shop s ON p.shop_id=s.id】
                // 所以，要么在PetMapper中的 loadById 方法的sql语句里面将t_shop语句去掉，要么重写一个 loadById2
                // 这个就看我们业务的发展了，这里呢，就另外写一个 loadById2，一个简单的根据id查询Pet对象，不需要联表
                Pet pet = petMapper.loadById2(Long.valueOf(petId));
                pet.setUser(null);
                Shop shop = new Shop();
                // 获取 shopId
                String shopId = quartzJobInfo.getParams().get("shopId").toString();
                shop.setId(Long.valueOf(shopId));
                pet.setShop(shop);
                pet.setState(1);// 改为上架状态
                petMapper.update(pet);

                break;
            case PayConstants.BUSINESSTYPE_GOODS:
                break;
            case PayConstants.BUSINESSTYPE_PRODUCT:
                break;
            case PayConstants.BUSINESSTYPE_FIND_MASTER:
                break;
        }
    }
}
